﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Collections;

namespace Export2IMG
{
    public partial class Export2Image : Form
    {
        Hashtable listTinh;
        Hashtable listHuyen;
        //Noi DKHK
        BindingSource bsDKHK;
        BindingSource bsDKHKHuyen;
        //Nguyen quan
        BindingSource bsNguyenQuan;
        BindingSource bsNQHuyen;

        QuanInfo quan;

        string rootPath =
            Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()));

        string imageURL = "";

        public Export2Image()
        {
            InitializeComponent();
        }


        //========================================
        // Các sự kiện.
        //========================================

        private void btnBrowser_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                imageURL = openFileDialog1.FileName;
                Image image = Image.FromFile(imageURL);
                pbAnh.Image = image;
                pbAnh.Invalidate();

            }
        }

        private void Export2Image_Load(object sender, EventArgs e)
        {
            GenerateTinhThanhPho();
        }

        private void btnGenerate_Click(object sender, EventArgs e)
        {
            List<QuanInfo> listQuanHuyen = GenerateQuanHuyen(cmbDKHKTinh.SelectedValue.ToString());

            Random rd = new Random();

            string firstItem = listQuanHuyen.ElementAt(rd.Next(0, listQuanHuyen.Count)).TenHuyen;
            MessageBox.Show("Tổ " + rd.Next(1, 80) + ", phường " + firstItem 
                + ", " + cmbDKHKTinh.Text);


            /*
            string soCMND = txtSoCMND.Text + GenerateSoCMND();
            string hoTen = "";
            string ngayThangNamSinh = "";
            string nguyenQuan = cmbNQHuyen.Text + ", " + cmbNQTinh.Text;
            string noiDKHK_TS = "Tổ " + GenerateNumber() + ", " + cmbDKHKHuyen.Text + ", ";
            string ngayCap = "";
            string[] ngayThangCap = new string[2];

            if (IsNumber(txtNamSinh.Text.Trim()))
            {
                hoTen = GetFullName();
                ngayThangNamSinh = GetRandomDateTime(int.Parse(txtNamSinh.Text.Trim()))
                    + "-" + txtNamSinh.Text.Trim();
            }
            else
            {
                MessageBox.Show("Cần phải nhập năm sinh!");
                txtNamSinh.Focus();
                return;
            }

            if (IsNumber(txtNgayCap.Text.Trim()))
            {
                ngayCap = GetRandomDateTime(int.Parse(txtNgayCap.Text.Trim()));
                ngayThangCap = ngayCap.Split('-');
            }
            else
            {
                MessageBox.Show("Cần nhập năm cấp!");
                txtNgayCap.Focus();
                return;
            }

            CMNDTruoc preview = new CMNDTruoc();
            preview.SetText(soCMND, hoTen, ngayThangNamSinh, nguyenQuan,
            cmbDKHKTinh.Text.Trim(), noiDKHK_TS, ngayThangCap[0], ngayThangCap[1],
            txtNgayCap.Text, cmbNoiCap.Text, imageURL);


            Bitmap image = new Bitmap(1219, 421);
            preview.DrawToBitmap(image, preview.ClientRectangle);
            image.Save(@"D:\abc.jpg");
            Console.WriteLine("Save success");*/
        }

        private void pbAnh_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                imageURL = openFileDialog1.FileName;
                Image image = Image.FromFile(imageURL);
                pbAnh.Image = image;
                pbAnh.Invalidate();

            }
        }

        private void btnPreview_Click(object sender, EventArgs e)
        {
            string soCMND = txtSoCMND.Text + GenerateSoCMND();
            string hoTen = "";
            string ngayThangNamSinh = "";
            string nguyenQuan = cmbNQHuyen.Text + ", " + cmbNQTinh.Text;
            string noiDKHK_TS = "Tổ " + GenerateNumber() + ", " + cmbDKHKHuyen.Text + ", ";
            string ngayCap = "";
            string[] ngayThangCap = new string[2];

            if (IsNumber(txtNamSinh.Text.Trim()))
            {
                hoTen = GetFullName();
                ngayThangNamSinh = GetRandomDateTime(int.Parse(txtNamSinh.Text.Trim()))
                    + "-" + txtNamSinh.Text.Trim();
            }
            else
            {
                MessageBox.Show("Cần phải nhập năm sinh!");
                txtNamSinh.Focus();
                return;
            }

            if (IsNumber(txtNgayCap.Text.Trim()))
            {
                ngayCap = GetRandomDateTime(int.Parse(txtNgayCap.Text.Trim()));
                ngayThangCap = ngayCap.Split('-');
            }
            else
            {
                MessageBox.Show("Cần nhập năm cấp!");
                txtNgayCap.Focus();
                return;
            }

            Preview preview = new Preview();
            preview.SetText(soCMND, hoTen, ngayThangNamSinh, nguyenQuan,
                cmbDKHKTinh.Text.Trim(), noiDKHK_TS, ngayThangCap[0], ngayThangCap[1],
                txtNgayCap.Text, cmbNoiCap.Text, imageURL);

            preview.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            GenerateForm g = new GenerateForm();
            g.Show();
        }

        /// <summary>
        /// Load quận huyện dựa trên tỉnh/thành phố
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmbTinh_SelectedIndexChanged(object sender, EventArgs e)
        {
            GenerateQuanHuyenDKHK("" + cmbDKHKTinh.SelectedValue);
        }

        private void cmbNQTinh_SelectedIndexChanged(object sender, EventArgs e)
        {
            GenerateQuanHuyenNQ("" + cmbNQTinh.SelectedValue);
        }

        //========================================
        // Các method.
        //========================================

        /// <summary>
        /// Kiểm tra xem tham số có phải kiểu số hay không
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private bool IsNumber(string data)
        {
            try
            {
                int result = int.Parse(data);
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        /// <summary>
        /// Load quận huyện dựa vào tỉnh DKHK
        /// </summary>
        private void GenerateQuanHuyenDKHK(string maTinh)
        {
            listHuyen = new Hashtable();
            bsDKHKHuyen = new BindingSource();

            XmlDataDocument xmldoc = new XmlDataDocument();
            XmlNodeList xmlnode;

            int i = 0;
            string str = null;

            FileStream fs = new FileStream(rootPath + "/data/QuanHuyen.xml",
                FileMode.Open, FileAccess.Read);
            xmldoc.Load(fs);
            xmlnode = xmldoc.GetElementsByTagName("Row");

            for (i = 0; i <= xmlnode.Count - 1; i++)
            {

                if (maTinh.Equals(xmlnode[i].ChildNodes.Item(4).InnerText.Trim()))
                {
                    listHuyen.Add(xmlnode[i].ChildNodes.Item(0).InnerText.Trim(),
                        xmlnode[i].ChildNodes.Item(1).InnerText.Trim());
                }
            }

            bsDKHKHuyen.DataSource = listHuyen;
            this.cmbDKHKHuyen.DataSource = bsDKHKHuyen;
            this.cmbDKHKHuyen.DisplayMember = "Value";
        }

        /// <summary>
        /// Load quận huyện dựa vào tỉnh nguyên quán
        /// </summary>
        private void GenerateQuanHuyenNQ(string maTinh)
        {
            listHuyen = new Hashtable();
            bsDKHKHuyen = new BindingSource();

            XmlDataDocument xmldoc = new XmlDataDocument();
            XmlNodeList xmlnode;

            int i = 0;
            string str = null;

            FileStream fs = new FileStream(rootPath + "/data/QuanHuyen.xml",
                FileMode.Open, FileAccess.Read);
            xmldoc.Load(fs);
            xmlnode = xmldoc.GetElementsByTagName("Row");

            for (i = 0; i <= xmlnode.Count - 1; i++)
            {

                if (maTinh.Equals(xmlnode[i].ChildNodes.Item(4).InnerText.Trim()))
                {
                    listHuyen.Add(xmlnode[i].ChildNodes.Item(0).InnerText.Trim(),
                        xmlnode[i].ChildNodes.Item(1).InnerText.Trim());
                }
            }

            bsDKHKHuyen.DataSource = listHuyen;
            this.cmbNQHuyen.DataSource = bsDKHKHuyen;
            this.cmbNQHuyen.DisplayMember = "Value";
        }

        /// <summary>
        /// Generate quận huyện dựa vào tỉnh
        /// </summary>
        private List<QuanInfo> GenerateQuanHuyen(string maTinh)
        {
            List<QuanInfo> list = new List<QuanInfo>();
            bsDKHKHuyen = new BindingSource();

            XmlDataDocument xmldoc = new XmlDataDocument();
            XmlNodeList xmlnode;

            int i = 0;

            FileStream fs = new FileStream(rootPath + "/data/QuanHuyen.xml",
                FileMode.Open, FileAccess.Read);
            xmldoc.Load(fs);
            xmlnode = xmldoc.GetElementsByTagName("Row");

            QuanInfo quan;

            for (i = 0; i <= xmlnode.Count - 1; i++)
            {
                if (maTinh.Equals(xmlnode[i].ChildNodes.Item(4).InnerText.Trim()))
                {
                    quan = new QuanInfo(maTinh,
                        xmlnode[i].ChildNodes.Item(0).InnerText.Trim(),
                        xmlnode[i].ChildNodes.Item(1).InnerText.Trim());

                    list.Add(quan);
                }
            }

            return list;
        }

        /// <summary>
        /// Load danh sách thành phố.
        /// </summary>
        private void GenerateTinhThanhPho()
        {
            listTinh = new Hashtable();
            bsDKHK = new BindingSource();
            bsNguyenQuan = new BindingSource();

            XmlDataDocument xmldoc = new XmlDataDocument();
            XmlNodeList xmlnode;

            int i = 0;
            string str = null;

            FileStream fs = new FileStream(rootPath + "/data/TinhTP.xml",
                FileMode.Open, FileAccess.Read);
            xmldoc.Load(fs);
            xmlnode = xmldoc.GetElementsByTagName("Row");

            for (i = 0; i <= xmlnode.Count - 1; i++)
            {
                listTinh.Add(xmlnode[i].ChildNodes.Item(0).InnerText.Trim(),
                    xmlnode[i].ChildNodes.Item(1).InnerText.Trim());
            }

            //Load tỉnh thành phố cho combobox DKHK
            bsDKHK.DataSource = listTinh;
            this.cmbDKHKTinh.DataSource = bsDKHK;
            this.cmbDKHKTinh.ValueMember = "Key";
            this.cmbDKHKTinh.DisplayMember = "Value";


            //Load tỉnh thành phố cho combobox nơi cấp 
            bsDKHK.DataSource = listTinh;
            this.cmbNoiCap.DataSource = bsDKHK;
            this.cmbNoiCap.ValueMember = "Key";
            this.cmbNoiCap.DisplayMember = "Value";


            //Load tỉnh thành phố cho combobox DKHK
            bsNguyenQuan.DataSource = listTinh;
            this.cmbNQTinh.DataSource = bsNguyenQuan;
            this.cmbNQTinh.ValueMember = "Key";
            this.cmbNQTinh.DisplayMember = "Value";

        }

        /// <summary>
        /// Tự sinh họ tên đầy đủ
        /// </summary>
        /// <returns></returns>
        private string GetFullName()
        {
            //Get first name
            String[] arrFirstName = GetDataFile(rootPath + "/data/Ho.txt");
            //Create array center Name and last name
            String[] arrCenterName;
            String[] arrLastName;
            if (rdNam.Checked)
            {
                //Get center name
                arrCenterName = GetDataFile(rootPath + "/data/DemNam.txt");
                //Get last name
                arrLastName = GetDataFile(rootPath + "/data/TenNam.txt");
            }
            else
            {
                //Get center name
                arrCenterName = GetDataFile(rootPath + "/data/DemNu.txt");
                //Get last name
                arrLastName = GetDataFile(rootPath + "/data/TenNu.txt");
            }

            //Random full name
            Random rd = new Random();
            return arrFirstName[rd.Next(0, arrFirstName.Length - 1)].Trim()
                    + " " + arrCenterName[rd.Next(0, arrCenterName.Length - 1)].Trim()
                    + " " + arrLastName[rd.Next(0, arrLastName.Length - 1)].Trim();
        }

        /// <summary>
        /// Tự sinh 5 số còn lại của CMND
        /// </summary>
        private string GenerateSoCMND()
        {
            Random rd = new Random();

            double i = rd.NextDouble() * 100000;
            return "" + Math.Round(i, 0);
        }

        /// <summary>
        /// Đọc dữ liệu tên
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private string[] GetDataFile(String path)
        {
            //Pass the file path and file name to the StreamReader constructor
            StreamReader sr = new StreamReader(path, Encoding.Unicode);

            //Array string result
            String[] result = new String[50];

            //Read the first line of text
            int i = 0;
            result[i++] = sr.ReadLine();

            //Continue to read until you reach end of file
            while (result[i - 1] != null)
            {
                //write to arraylist
                result[i++] = sr.ReadLine();
            }

            //close the file
            sr.Close();

            String[] arrReturn = new String[--i];
            Array.Copy(result, arrReturn, i);
            return arrReturn;
        }

        /// <summary>
        /// Tự sinh ngày tháng sinh dựa vào năm sinh
        /// </summary>
        /// <param name="year"></param>
        /// <returns>date of birth</returns>
        private string GetRandomDateTime(int year)
        {
            Random rd = new Random();
            int date = 0;
            int month = 0;
            do
            {
                date = rd.Next(1, 31);
                month = rd.Next(1, 12);
            }
            while (!CheckDate(date + "/" + month + "/" + year));

            return date + "-" + month;
        }

        /// <summary>
        /// Kiểm tra hợp lệ ngày tháng. 
        /// </summary>
        /// <param name="strDateTime"></param>
        /// <returns>isValidate</returns>
        private bool CheckDate(string strDateTime)
        {
            try
            {
                string[] arrDateTime = strDateTime.Split('/');
                int date = int.Parse(arrDateTime[0]);
                int month = int.Parse(arrDateTime[1]);
                int year = int.Parse(arrDateTime[2]);

                if ((date < 1) || (date > 31) ||
                   (month < 0) || (month > 11) ||
                   (year < 1))
                {
                    return false;
                }

                if ((date == 31) &&
                        ((month == 4) || (month == 6) ||
                         (month == 9) || (month == 11)))
                {
                    return false;
                }

                if (month == 2)
                {
                    if ((year % 4 == 0) && (date >= 30))
                    {
                        return false;
                    }
                    else if ((year % 4 != 0) && (date >= 29))
                    {
                        return false;
                    }
                }

                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        /// <summary>
        /// Tự sinh tổ dân phố, trong khoảng 01 đến 80
        /// </summary>
        /// <returns></returns>
        private int GenerateNumber()
        {
            Random rd = new Random();
            return rd.Next(1, 80);
        }

    }
}
